![]() |
![]() ![]() |
![]() |
![]()
Post
#141
|
|
Grupa: Zarejestrowani Postów: 690 Pomógł: 81 Dołączył: 6.04.2005 Skąd: Szczecin Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#142
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
z ctype_digit() trzeba ostrożnie, bo jeśli nie dostanie stringa tylko int np. 34 to zwróci false, do tego jeśli string jest puszty "" to zwraca true.
dlatego jak ktoś chce użyć do sprawdzania danch np. z GET to powinien użyć takiego złożenia
|
|
|
![]()
Post
#143
|
|
Grupa: Zarejestrowani Postów: 663 Pomógł: 6 Dołączył: 3.06.2007 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Postanowiłem przyłączyć się do dyskusji. Kiepski ze mnie teoretyk więc od razu podam moj sposób rozuminienia tego o czym piszecie...
Czy ktoś będzie się mógł mi włamać przy takim kodzie? Ten post edytował Black-Berry 26.06.2007, 09:55:17 |
|
|
![]()
Post
#144
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Nie, zawsze będzie 0, ponieważ tu jest błąd:
Zmienne z tablicy $_GET są zawsze typu string, więc musisz najpierw rzutować na int, bo: Cytat Returns TRUE if var is an integer, FALSE otherwise
|
|
|
![]()
Post
#145
|
|
Grupa: Zarejestrowani Postów: 663 Pomógł: 6 Dołączył: 3.06.2007 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Tyle się rozpisaliście na tym wątku, a jak ktoś (chyba słusznie) zauważył nie da sie praktycznie włamać do bazy MYSQL za pomocją SQL injection jeśli zmienne przekazywane metodą _GET są tylko i wyłącznie liczbami (a jak sądzę tak jest w większości przypadków.klk
Myślę też, że jeśli w przypadku przekazywania stringów zastosujemy funkcję real_escape_string() to włamanie SQLInjection będzie niemożliwe. Jeśli się myslę to prosze mnie skorygować bo w tym wątku czas na wniski. Pozdrawiam. Ten post edytował Black-Berry 3.07.2007, 10:10:18 |
|
|
![]()
Post
#146
|
|
Grupa: Zarejestrowani Postów: 690 Pomógł: 81 Dołączył: 6.04.2005 Skąd: Szczecin Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#147
|
|
Grupa: Zarejestrowani Postów: 663 Pomógł: 6 Dołączył: 3.06.2007 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
(IMG:http://forum.php.pl/style_emoticons/default/dry.gif) że też ja na to nie wpadłem.... (IMG:http://forum.php.pl/style_emoticons/default/worriedsmiley.gif)
Sory, że dalej drążę temat ale nie chcę się obudzic z ręką w nocniku później... Czy takie funkcje mnie ochronią przed SQL Injection? Czy powinienem do nich coś jeszcze dodać ?
EDIT: poprawiony return dla mysql_valid_string; Ten post edytował Black-Berry 4.07.2007, 11:01:27 |
|
|
![]()
Post
#148
|
|
Grupa: Zarejestrowani Postów: 690 Pomógł: 81 Dołączył: 6.04.2005 Skąd: Szczecin Ostrzeżenie: (0%) ![]() ![]() |
w mysql_valid_string return by się przydał
|
|
|
![]()
Post
#149
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 0 Dołączył: 31.01.2007 Ostrzeżenie: (0%) ![]() ![]() |
Black-Berry, po co tak kombinować? Po prostu do intów zawsze używaj (int) a do stringów mysql_real_escape_string albo PDO i bindParamy
|
|
|
![]()
Post
#150
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Black-Berry, po co tak kombinować? Po prostu do intów zawsze używaj (int) a do stringów mysql_real_escape_string albo PDO i bindParamy A wiesz co uzyskasz po takim czymś:
A trzeba pilnować, ja coś ma być liczbą dodatnią niech nią będzie, bo potem gdzieś ktoś nie przewidzi, że może być ujemną i się posypie, a czasem jest tak że nie wywala błędu i trzeba szukać. Aby jakiś algorytm działał poprawnie, muszą być spełnione wszystkie warunki początkowe. |
|
|
![]()
Post
#151
|
|
Grupa: Zarejestrowani Postów: 398 Pomógł: 10 Dołączył: 24.11.2004 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Cytat $strIn = '-2'; Jezeli ktos poda liczbe ujemna jako id rekordu, ktory ma zostac pobrany, a nie ma rekordu o takim id to nie dostanie z bazy nic ale o zadnym wlamaniu w ten sposob nie ma mowy. Ja osobiscie stosuje rzutowanie (int) przy liczbach, a przy stringach robie sobie parametryzowane zapytanie PDO i bindParam i to starczy w zupelnosci. |
|
|
![]()
Post
#152
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
@NoiseMc
Wiesz ale nie musi być to ID rekordu i nie zawsze musi działać jak myślisz, najlepiej jest zabezpieczyć tak, aby dostawał tylko to co oczekujesz. Bo na tym to wszystko polega, że masz dostać tylko to co powinieneś, wtedy nie martwisz się o jakieś inne dziwne przypadki. |
|
|
![]()
Post
#153
|
|
Grupa: Zarejestrowani Postów: 398 Pomógł: 10 Dołączył: 24.11.2004 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Ale po co kombinowac ...
Wystarczy w zupelnosci ... jezeli user poda w url-u prawidlowy ID to dostaje prawidlowy rekord ... jezeli nie to dostaje 'nic'. Nie chodzi o to zeby dostawac to co oczekujesz tylko o to zeby radzic robie z tym czego nie oczekujesz (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ten post edytował NoiseMc 9.08.2007, 16:26:43 |
|
|
![]()
Post
#154
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Ech, ciągle ograniczasz się do ID, do tego ja mam podejście że jak robić to dobrze, a kontrola tego co się dostaje ma być dokładna, nie wiem co potem będę chciał z tym robić, ale najlepiej jak jest tym co chcę, a nie coś "co działa".
Edit: literówka Ten post edytował Sedziwoj 9.08.2007, 18:16:49 |
|
|
![]()
Post
#155
|
|
Grupa: Zarejestrowani Postów: 398 Pomógł: 10 Dołączył: 24.11.2004 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Ja pisze o sposobach zabezpieczenia sie przed wstrzyknieciem zlosliwego SQL, a nie o walidacji danych wejsciowych. Jak wyprowadzasz psa na spacer to nie musisz sprawdzac czy nalezy do gatunku gryzacych ... wystarczy ze mu zalozysz kaganiec (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) tak wiec aby skutecznie ochronic sie przed SQL Injection wystarczy w zupelnosci to co napisal LEW21 i ja. Jezeli natomiast chodzi o walidacje danych wejsciowych bo na przyklad cena produktu musi byc liczba a jego adres url nie moze zawierac znakow specjalnych to w pelni sie z Toba zgadzam powinno sie sprawdzac wszystko ... a do tego uzywam Zend_Validate_* - bardzo prosta w uzyciu metoda, ktora w polaczeniu z Zend_Filter jest prosta, wygodna i porzadna.
Ten post edytował NoiseMc 9.08.2007, 19:14:56 |
|
|
![]()
Post
#156
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 10.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Używam kodu
Oraz standardowe pytanie (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) Czy moje rozwiązanie jest bezpieczne, co byście zmienili? |
|
|
![]()
Post
#157
|
|
Grupa: Zarejestrowani Postów: 663 Pomógł: 6 Dołączył: 3.06.2007 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Dołączam się do pytania... możebyśmy napisali wspólnie 2 ostateczne wersje funkcji czyszczących string oraz liczby typu float (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
@Sedziwoj Pomóż chłopie bo chyba tylko ty wiesz o co naprawdę chodzi (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Podrawiam. Edit: błędy. Ten post edytował Black-Berry 11.09.2007, 11:37:25 |
|
|
![]()
Post
#158
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Jak sprawdzać dane typu string? To zależy co może w nich być a co nie...
Co do liczb jeśli liczba może być tylko dodatnia całkowita preferuję, a jest z GET (ważne, bo w tej metodzie zmienna musi być tylu string)
To jest dobre do sprawdzania np. ID Przy liczbach które mogą być ujemne, lub/i zmiennoprzecinkowe możne użyć is_numeric() (ale trzeba pamiętać aby rzutować na typ oczekiwany, czyli nie pomijać (int)) ale znakiem dziesiętnym jest "." nie "," co może być problemem. Jeśli mamy "," to wtedy trzeba użyć preg_match() i wzorze typu '/[-+]?[1-9][0-9]*([\\.,][0-9]*)?/' lub zamienić "," na "." i robić tą poprzednią metodą. Wracając do string'ów, to na prawdę zależy co powinno być, a czego nie powinno. I o tym już było pisane, po znaj ' jest dla html właściwie obojętny, ale dla SQL może być zabójczy. Tylko że czasem go można zamienić używając htmlspecialchars() czy też można htmlentities() ale to zależy od specyfikacji, przy bazie mysql_escape_string() czy mysql_real_escape_string(), pg_escape_string() itd. itp. @Endzio Dla mysql NULL to jest typ, zaleca się
czyli aby zmienne nie były w ciągu znaków, (przy zapytaniu SQL gdzie jest wiele ' można użyć ", ale też zmienne są wyizolowane od ciągu). EDIT: P.S. Ja tam nie znam się na tym dobrze... tylko trochę wiem. Ten post edytował Sedziwoj 11.09.2007, 13:16:56 |
|
|
![]()
Post
#159
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 6.02.2007 Ostrzeżenie: (0%) ![]() ![]() |
Co do pierwszego postu:
Kod <?php $query = "update uzytkownicy set pole='$dane' where id='$id'\"; ?> Ja zrobił bym po prostu: Kod <?php
$id = settype($_GET['id'], 'integer'); $query = "update uzytkownicy set pole='$dane' where id='$id'\"; ?> |
|
|
![]()
Post
#160
|
|
Grupa: Zarejestrowani Postów: 1 033 Pomógł: 125 Dołączył: 17.09.2005 Skąd: Żywiec Ostrzeżenie: (0%) ![]() ![]() |
Cytat Ja zrobił bym po prostu: A co zwraca funkcja settype" title="Zobacz w manualu PHP" target="_manual? Chyba pomyliło Ci się z intval" title="Zobacz w manualu PHP" target="_manual ;] |
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 22:22 |